import dayjs from "@/utils/dayjs"
import { isTimestamp } from "@/utils/check"

// 挂载dayjs到uni
export function dayJs(...args) {
  return dayjs(...args)
}
/**
 * @description 条件显示格式化时间
 * @param {String} date 需格式化的时间
 * @param {String} format 时间格式
 * @return {String} 格式化后的时间
 * @example formatShowYearDate(date,"YYYY-MM-DD") // 时间格式文档 https://dayjs.gitee.io/docs/zh-CN/display/format
 */
export function formatShowYearDate(date, format = "YYYY-MM-DD") {
  const reviewDate = dayjs(date)
  const currentYear = dayjs().year()
  const isThisYear = reviewDate.year() === currentYear
  return isThisYear ? dayjs(date).format(format) : dayjs(date).format(`YYYY-${format}`)
}

/**
 * @description 格式化时间
 * @param {String} date 需格式化的时间
 * @param {String} format 时间格式
 * @return {String} 格式化后的时间
 * @example formatDate(date,"YYYY-MM-DD") // 时间格式文档 https://dayjs.gitee.io/docs/zh-CN/display/format
 */
export function formatDate(date, format = "YYYY-MM-DD") {
  return dayjs(date).format(format)
}

/**
 * @description 格式化时间戳时间
 * @param {String} date 需格式化的时间
 * @param {String} format 时间格式
 * @return {String} 格式化后的时间
 * @example formatUnixDate(date,"YYYY-MM-DD") // 时间格式文档 https://dayjs.gitee.io/docs/zh-CN/display/format
 */
export function formatUnixDate(date, format = "YYYY-MM-DD") {
  return dayjs.unix(date).format(format)
}

/**
 * @description 格式化时间
 * @param {String} time 需格式化的时间
 * @param {String} format 时间格式
 * @return {String} 格式化后的时间
 * @example formatTime(date,"HH:mm:ss") // 时间格式文档 https://dayjs.gitee.io/docs/zh-CN/display/format
 */
export function formatTime(date, format = "HH:mm:ss") {
  return dayjs(date).format(format)
}

/**
 * @description 查询指定时间的前后指定时间
 * @param {String} date 查询的指定时间
 * @param {Number} day day 前几天或者后几天
 * @param {String} format 时间格式
 * @return {String} 查询到的时间
 * @example aroundDate(date, 5, "YYYY-MM-DD") // 时间格式文档 https://dayjs.gitee.io/docs/zh-CN/display/format
 */
export function aroundDate(date, day = 0, format = "YYYY-MM-DD") {
  date = new Date(date)
  date.setDate(date.getDate() + day)
  return formatDate(date, format)
}

/**
 * @description 计算给定时间的星期几的日期
 * @param {String} date 查询的指定时间
 * @param {Number} week 周几 1-7
 * @param {String} format 时间格式
 * @return {String} 查询到的时间
 * @example weekDate(date, 5, "YYYY-MM-DD") // 时间格式文档 https://dayjs.gitee.io/docs/zh-CN/display/format
 */
export function weekDate(date, week = 1, format = "YYYY-MM-DD") {
  date = new Date(date.toString().replace(/-/g, "/"))
  date.setDate(date.getDate() - (date.getDay() == 0 ? 7 : date.getDay()) + week)
  return formatDate(date, format)
}

/**
 * @description 计算时间过去多久了
 * @param {String} date 查询的指定时间
 * @param {String} format 时间格式
 * @return {String} 查询到的时间
 * @example formatPastTime(date,"YYYY-MM-DD") // 时间格式文档 https://dayjs.gitee.io/docs/zh-CN/display/format
 */
export function formatPastTime(date, format = "YYYY-MM-DD") {
  let timer = new Date().getTime() - new Date(date.replace(/-/g, "/")).getTime()
  timer = parseInt(timer / 1000)
  let tips = ""
  switch (true) {
    case timer < 300:
      tips = "刚刚"
      break
    case timer >= 300 && timer < 3600:
      tips = parseInt(timer / 60) + "分钟前"
      break
    case timer >= 3600 && timer < 86400:
      tips = parseInt(timer / 3600) + "小时前"
      break
    case timer >= 86400 && timer < 2592000:
      tips = parseInt(timer / 86400) + "天前"
      break
    case timer >= 2592000 && timer < 365 * 86400:
      tips = parseInt(timer / (86400 * 30)) + "个月前"
      break
    default:
      tips = formatDate(date.replace(/-/g, "/"), format)
  }
  return tips
}

/**
 * @description 对比时间
 * @param {String|Date} startDate 开始时间
 * @param {String|Date} endDate 结束时间
 * @return {Object} 对比结果
 * @example diffDate(startDate,endDate)
 */
export function diffDate(startDate, endDate) {
  const start = new Date(dayjs(startDate))
  const end = new Date(dayjs(endDate))
  const startYear = start.getFullYear()
  const endYear = end.getFullYear()
  const startMonth = start.getMonth()
  const endMonth = end.getMonth()
  const startDateOfMonth = start.getDate()
  const endDateOfMonth = end.getDate()
  let years = endYear - startYear
  let months = endMonth - startMonth
  let days = endDateOfMonth - startDateOfMonth

  if (months < 0) {
    years--
    months += 12
  }

  if (days < 0) {
    const prevMonthEndDate = new Date(endYear, endMonth, 0).getDate()
    days = prevMonthEndDate - startDateOfMonth + endDateOfMonth
    months--
    if (months < 0) {
      years--
      months += 12
    }
  }
  const hours = end.getHours() - start.getHours()
  const minutes = end.getMinutes() - start.getMinutes()
  const seconds = end.getSeconds() - start.getSeconds()
  const milliseconds = end.getMilliseconds() - start.getMilliseconds()

  return { years, months, days, hours, minutes, seconds, milliseconds }
}

/**
 * 根据日期字符串判断日期在本周内还是下周，以及是本周的哪一天或是具体日期
 * @param {string} date - 表示日期的字符串，格式为 "YYYY-MM-DD" 或其他合法日期格式
 * @returns {string} - 返回描述日期的文字，例如 "本周一"，"下周二" 或具体日期字符串
 */
export function formatWeekDesc(dateString) {
  const date = isTimestamp(dateString) ? dayjs.unix(dateString) : dayjs(dateString)
  const startOfWeek = dayjs().startOf("week")
  const startOfNextWeek = dayjs().add(1, "week").startOf("week")
  const weekDays = ["日", "一", "二", "三", "四", "五", "六"]
  if (date.isSame(startOfWeek, "week")) {
    return "本周" + weekDays[date.day()]
  } else if (date.isSame(startOfNextWeek, "week")) {
    return "下周" + weekDays[date.day()]
  } else {
    return date.format("YYYY-MM-DD")
  }
}

/**
 * 根据日期字符串判断日期在本周内还是下周，以及是本周的哪一天或是具体日期
 * @param {string} date - 表示日期的字符串，格式为 "YYYY-MM-DD" 或其他合法日期格式
 * @returns {string} - 返回描述日期的文字，例如 "本周一"，"下周二" 或具体日期字符串
 */
export function formatDayWeekDesc(date) {
  const today = dayjs()
  const week = dayjs(date).day()
  const { days: day } = diffDate(today, dayjs(date))
  const days = ["今天", "明天", "后天"]
  const weekDays = ["周日", "周一", "周二", "周三", "周四", "周五", "周六"]
  if (day >= 0 && day < 3) return days[day]
  return weekDays[week] || dayjs(date).format("YYYY-MM-DD")
}
/**
 * 根据日期字符串判断日期在本周内还是下周，以及年份之类
 * @param {string} date - 表示日期的字符串，格式为 "YYYY-MM-DD" 或其他合法日期格式
 * @returns {string} - 返回描述日期的文字，例如 "明天"，"后天" 等
 */
export function formatDayDateDescs(date) {
  const today = dayjs()
  const week = dayjs(date).day()
  const { days: day, months: month } = diffDate(today, dayjs(date))
  // console.log("day:", day, "months:", month) // 检查是否有误
  const days = ["今天", "明天", "后天"]
  const weekDays = ["周日", "周一", "周二", "周三", "周四", "周五", "周六"]
  const year = dayjs(date).year() !== today.year() ? dayjs(date).format("YYYY年") : ""
  if (month == 0 && day >= 0 && day < 3) return dayjs(date).format("M月D日 ") + days[day]
  return year + dayjs(date).format("M月D日 ") + weekDays[week] || dayjs(date).format("YYYY-MM-DD")
}
/**
 * 根据日期返回指定格式 '至xxxx年xx月xx日'
 * @param {string} date - 表示日期的字符串，格式为 "YYYY-MM-DD" 或其他合法日期格式
 * @returns {string}
 */
export function splitDate(date) {
  const parsedDate = dayjs(date)
  const year = parsedDate.year()
  const month = (parsedDate.month() + 1).toString().padStart(2, "0")
  const day = parsedDate.date().toString().padStart(2, "0")
  return `至${year}年${month}月${day}日`
}
